﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using WLMCoreLibrary;
using SAW_Core;
using System.Data;
using System.Data.Odbc;
using System.Text;
using System.Configuration;

namespace SAW
{
    public partial class ModuloBancos : System.Web.UI.Page
    {
        dbConnector ConexionDB;
        protected override void OnUnload(EventArgs e)
        {
            base.OnUnload(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            ConexionDB = new dbConnector();
            FuncionesLocales.CheckPagePermision(ref ConexionDB);
            FuncionesLocales.ManejarMensaje();

            if (Request.QueryString["RealizarDepositoBancario"] != null)
            {

                RegistrarDepositoBancario(Convert.ToInt32(Request.QueryString["idCuentaBancaria"]), WLMFunctions.MonedaADecimal(Request.QueryString["TotalPago"]), Convert.ToDateTime(Request.QueryString["fechaPago"]), Request.QueryString["NoDocumento"], Convert.ToInt32(Request.QueryString["TipoDeposito"]), Request.QueryString["descripcion"]);

            }

            if (Request.QueryString["listado"] == "true")
            {
                if (Request.QueryString["Cuentas"] != null)
                    ListadoJSONCuentas();
                if (Request.QueryString["Movimientos"] != null)
                    ListadoJSONMovimientos();
                if (Request.QueryString["Cheques"] != null)
                    ListadoJSONCheques();
            }

            if (Request.QueryString["idCuenta"] != null && Request.QueryString["eliminar"] != null)
                BorrarCuentaBancaria(Convert.ToInt32(Request.QueryString["idCuenta"]));

            if (Request.QueryString["impresion"] != null)
            {
                if (Request.QueryString["cheque"] != null)
                {
                    ImpresionCheque(Convert.ToInt32(Request.QueryString["cheque"]), Convert.ToBoolean(Request.QueryString["negociable"]), Convert.ToBoolean(Request.QueryString["abono"]), Convert.ToBoolean(Request.QueryString["poliza"]));
                }
            }


            if (Request.QueryString["Add"] != null)
            {
                PanelGridCuentas.Visible = false;
                if (Request.QueryString["cuenta"] != null)
                {
                    PanelAltaBanco.Visible = true;
                    BotonGuardarCuentaBancaria.Enabled = true;
                }
                if (Request.QueryString["movimiento"] != null)
                {
                    PanelAltaMovimiento.Visible = true;
                    botonGuadarMovimientoBancario.Enabled = true;
                }
                if (Request.QueryString["cheque"] != null)
                {
                    PanelAltaCheque.Visible = true;
                    botonGuardarCheque.Enabled = true;
                    if (!IsPostBack)
                        FechaPagoCheque.Text = DateTime.Now.ToString("dd/MM/yyyy");
                }
            }
            else
            {


                if (Request.QueryString["detalle"] != null)
                {
                    if (Request.QueryString["cheque"] != null)
                    {
                        DetalleCheque(Convert.ToInt32(Request.QueryString["idCheque"]));
                    }
                    if (Request.QueryString["cuenta"] != null)
                    {
                        DetalleCuenta(Convert.ToInt32(Request.QueryString["idCuenta"]));
                    }
                }
                else
                {

                    if (Request.QueryString["movimientos"] != null)
                    {
                        PanelGridCuentas.Visible = false;
                        PanelGridMovimientos.Visible = true;
                    }

                    if (Request.QueryString["cheque"] != null)
                    {
                        PanelGridCuentas.Visible = false;
                        PanelGridCheques.Visible = true;
                    }
                }
            }

        }

        protected void ListadoJSONCuentas()
        {

            string FieldList = "SELECT C.id,institucion,cuenta,Alias,CONCAT('$ ',CAST(Format(SaldoActual,2) AS CHAR)) as SaldoActuala,numeroUltimoCheque,CONCAT(\"<img src='/iconos/vcard.png' title='Reporte de la cuenta \",CAST(C.cuenta AS CHAR) ,\" [\",Alias ,\"]' border=0  onclick=CargarPaginaBancos(\'/ModuloBancos.aspx?idCuenta=\",CAST(C.id AS CHAR),\"&detalle=true')  class='edicionGrid' />\" ) as editar,CONCAT(\"<img src='/iconos/user_edit.png' class='edicionGrid' title='Editar la Cuenta Bancaria No. \",CAST(C.cuenta AS CHAR) ,\" [\",Alias ,\"]' onclick=CargarPaginaBancos(\'/ModuloBancos.aspx?idCuenta=\",CAST(C.id AS CHAR) ,\"&editar=true\'); >\" ) as detalle FROM BANCOS C ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            where = " WHERE activo=1 ";
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void ListadoJSONMovimientos()
        {

            string FieldList = "SELECT M.id,M.FechaAplicacion,B.Alias,IF (CH.tipoRetiro=1,CONCAT('Ch. ',CAST(IFNULL(CH.NoCheque,'') AS CHAR)),CONCAT('Ref. ',CAST(IFNULL(CH.NoReferencia,'') AS CHAR))) as NoCheque1,nombreDepositario,M.Descripcion,if(deposito=1,CONCAT('$ ',CAST(Format(M.Monto,2) AS CHAR)),'$ 0') as Monto1,if(retiro=1,CONCAT('$ ',CAST(Format(M.Monto,2) AS CHAR)),'$ 0') as Monto1,CONCAT('$ ',CAST(Format(M.SaldoInicial,2) AS CHAR)) as saldoIniciala,CONCAT('$ ',CAST(Format(M.SaldoFinal,2) AS CHAR)) as saldoInicialb,CONCAT(\"<img src='/iconos/vcard.png' title='Detalle del Cliente No. \",CAST(M.id AS CHAR) ,\" [\",CAST(M.id AS CHAR) ,\"]' border=0  onclick=CargarPaginaCliente(\'/ModuloClientes.aspx?idCliente=\",CAST(M.id AS CHAR),\"&detalle=true')  class='edicionGrid' />\" ) as editar,CONCAT(\"<img src='/iconos/user_edit.png' class='edicionGrid' title='Editar al Cliente No. \",CAST(M.id AS CHAR) ,\" [\",CAST(M.id AS CHAR) ,\"]' onclick=CargarPaginaCliente(\'/ModuloClientes.aspx?idCliente=\",CAST(M.id AS CHAR) ,\"&editar=true\'); >\" ) as detalle FROM BANCOSMOVIMIENTOS M LEFT JOIN BANCOS B ON B.id=M.idCuentaBancaria LEFT JOIN CHEQUES CH ON CH.id=M.idCheque LEFT JOIN COTIZACIONES C ON C.id=M.idCotizacion";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];

            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            string filtroFechas = "";
            if (Request.QueryString["fechaInicial"] != null)
                filtroFechas = " AND (M.FechaAplicacion BETWEEN '" + Convert.ToDateTime(Request.QueryString["fechaInicial"]).ToString("yyyy-MM-dd") + "' AND '" + Convert.ToDateTime(Request.QueryString["fechaFinal"]).AddDays(1).ToString("yyyy-MM-dd") + "') ";
            if (Request.QueryString["idCuenta"] != null)
            {
                if (Request["query"] != null)
                    where = " WHERE " + qtype + " LIKE '%" + Request["query"] + "%' AND M.activo=1  AND idCuentaBancaria='" + Request.QueryString["idCuenta"] + "' " + filtroFechas;
                else
                    where = " WHERE B.activo=1 AND M.activo=1 AND idCuentaBancaria='" + Request.QueryString["idCuenta"] + "' " + filtroFechas;
            }
            else
            {
                if (Request["query"] != null) 
                    where = " WHERE B.activo=1 AND M.activo=1 AND " + qtype + " LIKE '%" + Request["query"] + "%' " + filtroFechas;
                else
                    where = " WHERE B.activo=1 AND M.activo=1 " + filtroFechas;
            }
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;
            //Response.Write(strCommand);
            //Response.End();
            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void ListadoJSONCheques()
        {

            string FieldList = "SELECT C.id,B.Alias,NoCheque,ANombreDe,Concepto,C.FechaCreacion,FechaPago,CONCAT('$ ',CAST(Format(Monto,2) AS CHAR)) as montoA," +
                "if(cobrado=1,\"<div class='img pagado' title='pagado'></div>\",(if(cancelado=1,\"<div class='img cancelado' title='cancelado'></div>\",NULL))) as cobrado1," +
                "CONCAT(\"<img src='/iconos/cheque.png' title='Detalle del Cheque No. \",CAST(C.noCheque AS CHAR),\" de \",B.Alias  ,\" [\",C.ANOmbreDE ,\"]' border=0  onclick=CargarPaginaBancos(\'/ModuloBancos.aspx?cheque=true&idCheque=\",CAST(C.id AS CHAR),\"&detalle=true')  class='edicionGrid' />\" ) as editar FROM CHEQUES C LEFT JOIN BANCOS B ON B.id=C.idCuenta  ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];

            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];

            if (Request["query"] != null) where = " WHERE " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " ";
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void BotonGuardarCuentaBancaria_Click(object sender, EventArgs e)
        {
            CuentaBancaria cuentaBanco;
            if (idRegistroBanco.Value == "0")
            {
                cuentaBanco = new CuentaBancaria(ref ConexionDB);
                cuentaBanco.saldoActual = WLMFunctions.MonedaADecimal(saldoActual.Text);
                cuentaBanco.numeroUltimoCheque = Convert.ToInt32(numeroUltimoCheque.Text);
            }
            else
                cuentaBanco = new CuentaBancaria(Convert.ToInt32(idRegistroBanco.Value),ref ConexionDB);
            cuentaBanco.institucion = institucion.Text;
            cuentaBanco.alias = aliasCuenta.Text;
            cuentaBanco.cuenta = cuenta.Text;
            cuentaBanco.moneda = moneda.Text;
            cuentaBanco.numeroSucursal = numeroSucursal.Text;
            cuentaBanco.nombreSucursal = nombreSucursal.Text;
            cuentaBanco.direccionSucursal = direccionSucursal.Text;
            cuentaBanco.Save();
            ConexionDB.CloseConnection();
            Response.Redirect("/ModuloBancos.aspx");
        }

        protected void botonGuadarMovimientoBancario_Click(object sender, EventArgs e)
        {
            MovimientoBancario movimiento = new MovimientoBancario(ref ConexionDB);
            //movimiento.saldoInicial =  saldoInicial.Text;
            movimiento.monto = WLMFunctions.MonedaADecimal(monto.Text);
            movimiento.descripcion = descripcion.Text;
            movimiento.referenciaNumerica = referenciaNumerica.Text;
            movimiento.referencia = referencia.Text;
            //movimiento.saldoFinal = saldoFinal.Text;
            //movimiento.retiro = retiro.Checked;
            //movimiento.deposito = deposito.Checked;
            movimiento.fechaAplicacion = Convert.ToDateTime(fechaAplicacion.Text);
            movimiento.NoDocumento = NoDocumento.Text;
            movimiento.nombreDepositante = nombreDepositante.Text;
            movimiento.nombreDepositario = nombreDepositario.Text;
            //movimiento.idCheque = idCheque.Text;
            //movimiento.idCotizacion = idCotizacion.Text;
            //movimiento.idCompra = idCompra.Text;
            //movimiento.contabilizado = contabilizado.Checked;
            //movimiento.fechaContabilizado = fechaContabilizado.Text;
            //movimiento.idCliente = idCliente.Text;
            //movimiento.idProveedor = idProveedor.Text;
            movimiento.idGasto = Convert.ToInt32(idGasto.Text);
            // movimiento.idGastoTipo = Convert.ToInt32(idGastoTipo.Text);
            movimiento.idCuentaBancaria = Convert.ToInt32(idCuentaBancaria.Text);
            movimiento.Save();

        }

        protected void botonGuardarCheque_Click(object sender, EventArgs e)
        {
            SalidaDinero salidaDinero = new SalidaDinero(ref ConexionDB);
            salidaDinero.idCuenta = Convert.ToInt32(idCuentaCheque.Value);
            //cheque.NoCheque = NoCheque.Text;
            salidaDinero.idProveedor = Convert.ToInt32(idProveedorCheque.Value);
            salidaDinero.FechaPago = Convert.ToDateTime(FechaPagoCheque.Text);
            salidaDinero.Monto = WLMFunctions.MonedaADecimal(MontoCheque.Text);
            salidaDinero.ANombreDe = ANombreDe.Text;
            salidaDinero.Concepto = ConeptoCheque.Text;
            salidaDinero.tipoRetiro = Convert.ToInt32(tipoRetiroDinero.SelectedValue);


            //cheque.idCompra = idCompra.Text;
            //cheque.SaldoInicialCuenta = SaldoInicialCuenta.Text;
            //cheque.SaldoFinalCuenta = SaldoFinalCuenta.Text;
            //cheque.cobrado = cobrado.Checked;
            //cheque.impreso = impreso.Checked;
            
            if (salidaDinero.tipoRetiro == 1)
            {
                CuentaBancaria cuenta = new CuentaBancaria(salidaDinero.idCuenta,ref ConexionDB);
                cuenta.numeroUltimoCheque++;
                salidaDinero.NoCheque = cuenta.numeroUltimoCheque;
                cuenta.Save();
            }
            if (salidaDinero.tipoRetiro == 2)
                salidaDinero.NoReferencia=salidaDinero.NoAutorizacion = NoCheque.Text;

            
            salidaDinero.Save();
            
            ConexionDB.CloseConnection();
            Response.Redirect("/ModuloBancos.aspx?detalle=true&cheque=true&idCheque=" + salidaDinero.id);
        }

        protected void DetalleCheque(int idChequeMostrar)
        {
            PanelGridCuentas.Visible = false;
            PanelDetalleCheque.Visible = true;
            SalidaDinero cheque = new SalidaDinero(idChequeMostrar,ref ConexionDB);
            cheque.GenerarArchivoXML();
            string rutaArchivos = "ChequesXML/" + cheque.idCuenta.ToString("000") + "/" + idChequeMostrar.ToString("00000") + "/";
            List<ParametroTransformacionXML> parametros = new List<ParametroTransformacionXML>();
            parametros.Add(new ParametroTransformacionXML("tipoSalida", "1"));

            LabelDetalleCheque.Text = WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idChequeMostrar.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "chequePantalla" + cheque.idCuenta + ".xsl",parametros);

            if (!cheque.cobrado && !cheque.cancelado)
            {
                botonAutorizarCheque.Enabled = true;
                botonCancelarCheque.Enabled = true;
            }
            idChequeMostrado.Value = idChequeMostrar.ToString();
            Response.Write("<script>$(document).ready(function(){$('#botonImprimirCheque').attr('disabled',false);});</script>");
        }

        protected void DetalleCuenta(int idCuentaBancaria)
        {
            PanelGridCuentas.Visible = false;
            PanelDetalleCuenta.Visible = true;

            botonEditarCuenta.Enabled = true;
            CuentaBancaria cuenta = new CuentaBancaria(idCuentaBancaria,ref ConexionDB);
            cuenta.GenerarArchivoXML();
            string rutaArchivos = "CuentasBancariasXML/" + cuenta.id.ToString("000") + "/" + idCuentaBancaria.ToString("00000") + "/";
            idCuentaDetalle.Value = cuenta.id.ToString();
            idRegistroBanco.Value = cuenta.id.ToString();

            LabelDetalleCuenta.Text = WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idCuentaBancaria.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "cuentaPantalla.xsl");
            Response.Write("<script>$(document).ready(function(){$('#botonBorrarCuenta').attr('disabled',false);});</script>");


        }

        protected void botonAutorizarCheque_Click(object sender, EventArgs e)
        {
            SalidaDinero cheque = new SalidaDinero(Convert.ToInt32(Request.QueryString["idCheque"]),ref ConexionDB);
            if (!cheque.cobrado)
            {

                int idMovBancario= cheque.RealizarPago();
                if(cheque.idCompra!=0)
                {
                    Compra compra = new Compra(cheque.idCompra,ref ConexionDB);
                    cheque.PagoChequeCompra(compra, new MovimientoBancario(idMovBancario,ref ConexionDB));
                }
                ConexionDB.CloseConnection();
                Response.Redirect("/ModuloBancos.aspx?detalle=true&cheque=true&idCheque=" + cheque.id);
            }
        }

        protected void botonCancelarCheque_Click(object sender, EventArgs e)
        {
            SalidaDinero cheque = new SalidaDinero(Convert.ToInt32(Request.QueryString["idCheque"]),ref ConexionDB);
            if (!cheque.cobrado)
            {
                cheque.cancelado = true;
                cheque.Save();
                //DetalleCheque(cheque.id);
                ConexionDB.CloseConnection();
                Response.Redirect("/ModuloBancos.aspx?detalle=true&cheque=true&idCheque=" + cheque.id);
            }

        }

        protected void ImpresionCheque(int idChequeImprimir,bool negociable,bool DepositoACuenta,bool poliza)
        {
            SalidaDinero cheque = new SalidaDinero(idChequeImprimir,ref ConexionDB);
            cheque.GenerarArchivoXML();
            string rutaArchivos = "ChequesXML/" + cheque.idCuenta.ToString("000") + "/" + idChequeImprimir.ToString("00000") + "/";
            List<ParametroTransformacionXML> parametros = new List<ParametroTransformacionXML>();
            if(poliza)
            parametros.Add(new ParametroTransformacionXML("tipoSalida", "1"));
            else
                parametros.Add(new ParametroTransformacionXML("tipoSalida", "2"));
            parametros.Add(new ParametroTransformacionXML("noNegociable", negociable.ToString()));
            parametros.Add(new ParametroTransformacionXML("depositoCuenta", DepositoACuenta.ToString()));
            parametros.Add(new ParametroTransformacionXML("poliza", poliza.ToString()));

            string chequeHTML = WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idChequeImprimir.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "chequePantalla" + cheque.idCuenta + ".xsl",parametros);
            PDFCreator pdf = new PDFCreator();
            int alturaDocumento = 202;
            bool landscape = true;
            if (poliza)
            {
                alturaDocumento = 600;
                landscape = false;
            }
            //Response.Write(chequeHTML); Response.End();
            pdf.CrearPDFdeHTML(chequeHTML, "Cheque No." + cheque.NoCheque, rutaArchivos,landscape, 0, 0, 0, 0, 9, true, alturaDocumento, 792);
        }

        protected void botonEditarCuenta_Click(object sender, EventArgs e)
        {
            CuentaBancaria cuentaBancaria = new CuentaBancaria(Convert.ToInt32(Request.QueryString["idCuenta"]),ref ConexionDB);
            PanelAltaBanco.Visible = true;
            PanelGridCuentas.Visible = false;
            institucion.Text = cuentaBancaria.institucion;
            aliasCuenta.Text = cuentaBancaria.alias;
            saldoActual.Text = cuentaBancaria.saldoActual.ToString("C");
            numeroSucursal.Text = cuentaBancaria.numeroSucursal;
            numeroUltimoCheque.Text = cuentaBancaria.numeroUltimoCheque.ToString(); ;
            nombreSucursal.Text = cuentaBancaria.nombreSucursal;
            cuenta.Text = cuentaBancaria.cuenta;
            LabelDetalleCuenta.Visible = false;
            BotonGuardarCuentaBancaria.Enabled = true;
            idRegistroBanco.Value = cuentaBancaria.id.ToString();
        }

        protected void BorrarCuentaBancaria(Int32 idCuentaBancaria)
        {
            CuentaBancaria cuenta = new CuentaBancaria(idCuentaBancaria,ref ConexionDB);
            cuenta.Delete();
            string mensaje = "La cuenta ha sido Eliminada de el sistema correctamente";
            ConexionDB.CloseConnection();
            Response.Redirect("/moduloBancos.aspx?mensaje=" + mensaje);
        }

        protected void RegistrarDepositoBancario(int idCuenta, decimal MontoPago, DateTime fechaPago, string noDocumento, int tipoDeposito,string descripcionDeposito)
        {
            MovimientoBancario movimiento = new MovimientoBancario(ref ConexionDB);
            CuentaBancaria cuenta = new CuentaBancaria(idCuenta,ref ConexionDB);
            movimiento.monto = MontoPago;
            movimiento.fechaAplicacion = fechaPago;
            movimiento.descripcion = movimiento.Concepto = descripcionDeposito;
            if(descripcionDeposito=="")
                movimiento.descripcion = movimiento.Concepto = "Deposito Bancario Variado";

            movimiento.deposito = true;
            movimiento.retiro = false;
            movimiento.NoDocumento = noDocumento;
            movimiento.idCuentaBancaria = cuenta.id;
            movimiento.TipoMovimiento = tipoDeposito;

            movimiento.Save();
            cuenta.ProcesarMovimientoBancario(movimiento);

            Response.Write("Se ha realizado un deposito <br>Por un total de " + movimiento.monto.ToString("C") + " a la cuenta '" + cuenta.alias + "'");
            ConexionDB.CloseConnection();
            Response.End();

        }
    }


}